package com.mk.common.office;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;

/**
 * @Author: yq
 * @Description: 用OpenOffice将office转化为pdf
 * @Date: Created in 10:58 AM 3/19/18
 */
public class Office2PDFUtil {
    /**
     * 将Office文档转化为pdf。 运行该函数需要用到OpenOffice，OpenOffice下载地址为：
     * http://www.openoffice.org/
     *
     * <pre>
     *     方法示例：
     *     String sourceFile = "F:\\office\\source.doc";
     *     String destFile = "F:\\office\\pdf\\dest.pdf";
     *     Converter.office2PDF(sourceFile,destFile);
     * </pre>
     * @param sourceFile
     *     源文件，绝对路径 可以使office2003-2007全部格式的文档，包括.doc,.docx, .xls, .xlsx, .ppt,
     *     .pptx等, 例如：F:\\office\\source.doc
     * @param destFile
     *     目标文件，绝对路径，例如 F:\\office\\pdf\\dest.pdf
     * @return 操作成功与否的提示，
     *     -1 ： 表示找不到源文件
     *     0 ： 表示转换成功
     *     1 ： 表示转换失败
     */
    public static int office2PDF(String sourceFile,String destFile,String openOfficePath) {
        try {
            File inputFile = new File(sourceFile);
            if (!inputFile.exists())
                return -1;//找不到源文件
            File outputFile = new File(destFile);
            if (!outputFile.exists())
                outputFile.mkdirs();//目标文件夹不存在，则创建目标文件夹
            //比对openoffice的安装地址后是否有 \\
            if (openOfficePath.charAt(openOfficePath.length() - 1) != '\\')
                openOfficePath += "\\";
            //启动openoffice的服务
            String command = openOfficePath + "program\\soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard";
            Process pro = Runtime.getRuntime().exec(command);
            //connect to OpenOffice.org instance running on port 8100
            OpenOfficeConnection connection = new SocketOpenOfficeConnection(
                    "127.0.0.1", 8100
            );
            connection.connect();

            //convert
            DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert(inputFile, outputFile);

            //close the connection
            connection.disconnect();
            //关闭 Openoffice服务的进程
            pro.destroy();

            return 0;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return -1;
        } catch (ConnectException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 1;
    }
}
